package generador;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class TablaSimbolo {

	private Map<String, List<Simbolo>> bloques;
	private List<Simbolo> simbolosGlobales;
	private Integer idGlobal;

	public TablaSimbolo() {
		this.bloques = new HashMap<String, List<Simbolo>>();
		this.simbolosGlobales = new ArrayList<Simbolo>();
		idGlobal = new Integer(0);
	}

	public void insertarSimboloGlobal(Simbolo simbolo) {
		this.simbolosGlobales.add(simbolo);
	}

	public Simbolo buscarSimbolo(List<Simbolo> simbolos, String nombre) {
		Iterator<Simbolo> it = simbolos.iterator();
		Simbolo simbolo = null;
		while (it.hasNext()) {
			simbolo = it.next();
			if (simbolo.getNombre().equals(nombre)) {
				return simbolo;
			}
		}
		return null;
	}

	private Integer getNuevoId() {
		return (idGlobal++);
	}

	// Si lo agrega devuelve el simbolo con el id, sino, null
	public Simbolo agregarSimbolo(String bloque, String valor, String tipo,
			String nombre) {
		List<Simbolo> simbolos;
		if (bloque == null) {
			simbolos = getSimbolosGlobales();
		} else {
			simbolos = getSimboloByKey(bloque);
		}
		if (buscarSimbolo(simbolos, nombre) != null) {
			return null;

		} else {
			Integer idNuevo = getNuevoId();
			Simbolo simbolo = new Simbolo(nombre, tipo, valor, idNuevo);
			simbolos.add(simbolo);
			return simbolo;

		}
	}

	public boolean insertarBloque(List<Simbolo> simbolos, String key) {
		if (this.bloques.get(key) == null) {
			this.bloques.put(key, simbolos);
			return true;
		}
		return false;
	}

	public List<Simbolo> getSimboloByKey(String key) {
		return this.bloques.get(key);
	}

	public Map<String, List<Simbolo>> getBloques() {
		return bloques;
	}

	public void setBloques(Map<String, List<Simbolo>> bloques) {
		this.bloques = bloques;
	}

	public List<Simbolo> getSimbolosGlobales() {
		return simbolosGlobales;
	}

	public void setSimbolosGlobales(List<Simbolo> simbolosGlobales) {
		this.simbolosGlobales = simbolosGlobales;
	}

	public String getCodigoDatos() {
		return null;
	}

	public Simbolo getSimbolo(int id) {
		Simbolo simbolo = null;
		simbolo = buscarSimbolo(simbolosGlobales, id);
		if (simbolo != null) {
			return simbolo;
		} else {
			Iterator it = bloques.entrySet().iterator();
			while (it.hasNext()) {
				Map.Entry map = (Map.Entry) it.next();
				simbolo = buscarSimbolo((List<Simbolo>)map.getValue(), id);
				if (simbolo != null) {
					return simbolo;
				}
			}
		}
		return null;
	}

	public Simbolo buscarSimbolo(List<Simbolo> simbolos, int id) {
		Iterator<Simbolo> it = simbolos.iterator();
		Simbolo simbolo = null;
		while (it.hasNext()) {
			simbolo = it.next();
			if (simbolo.getId().equals(id)) {
				return simbolo;
			}
		}
		return null;
	}
}
